The field of software development has undergone substantial evolution in the 50 years since its inception. An early form of software simply abstracted and represented hardware functions in a “human readable” form known as assembly language code. Special purpose application programs could then be written in such code to command the computer to perform an organized set of operations.
Assembly language coding has several drawbacks. One is that the code required to carry out a particular function has to be specifically included in each program needing that function: dozens of software developers might write code (or at least copy code) for a single function dozens of times for dozens of programs. A second drawback to assembly language coding is that programmers must understand the computer's internal hardware resources: as hardware is changed, so must the programmers' software programs.
To address these and other difficulties, the software necessary to operate a computer was soon split into two classes: operating system software, and applications software.
Operating system software (sometimes termed simply “the operating system”) is a set of computer code that performs a variety of functions, including interacting with the computer hardware; insulating the programmer from the specifics of the computer hardware; and providing general functionality (“resources”) that many application programs require.
Applications software (sometimes terms “applications”), in contrast, addresses a particular problem to be solved. Examples of applications software are word processors and accounting programs. Applications software and operating systems communicate using a series of standardized instruction codes passed between the two. The operating system software interprets these standardized instruction codes, and controls the computer's hardware resources in response thereto. Oftentimes, information in the form of data or messages is passed back to the applications software. In this manner, the operating system software—once written—effects most direct control of the hardware, allowing the application software programmer to focus on the particular problem sought to be solved. (Alternatively, application software can still include assembly language code—directly controlling the computer hardware and bypassing the operating system. This may be done for speed or control, or simply to provide functionality not supported by the operating system.)
The relationship between operating system software, applications software and hardware is not always clearly defined. Over the last several decades, each has evolved rapidly. As was noted above, operating systems sometimes evolve to include functions common to several applications. Similarly, operating systems are sometimes modified to include functionality previously provided only in hardware and visa-versa. For example, data compression can be done in software (by an operating system or application) and in hardware (by a specialized chip). Essentially, the three technologies have developed together in response to user demand and advances in technology.
A specific factor driving the evolution of operating system software has been the desire to simplify and speed application software development. Application software development can be a daunting task, sometimes requiring hundreds of man-years of effort for a sophisticated program. For a popular operating system such as Microsoft® Windows™, applications software developers may write thousands of different applications each year to execute on the Windows operating system. The investment in application development time is large. One incentive to create such programs is to provide good support for the application software through the operating system. This requires building a coherent and usable base for applications developers to work with.
Often, development of application software can be made simpler by making the operating system more complex. That is (as noted above), if a function may be useful to several different application programs, it is better to write it once for inclusion in the operating system, than requiring dozens of software developers to write it dozens of times for inclusion in dozens of different applications. In this manner, if the operating system supports a wide range of common functionality required by a number of applications, significant savings in applications software development costs and time can be achieved.
Another factor driving the continuing evolution of operating system software is the ongoing development of faster and more sophisticated computer hardware—both in the computer's central processing unit (CPU) and in its peripheral devices (e.g. printers). New CPUs typically offer enhanced instruction sets that enable certain new operations to be performed, or enable old operations to be performed more quickly. Corresponding enhancements are usually made to the operating system to afford applications access to these new CPU capabilities.
The relationship between operating systems and hardware has also driven the development of a special class of software: device drivers. Peripheral devices usually do not communicate directly with the operating system. Instead, such devices usually communicate with device driver software, which in turn communicate with the operating system. A device driver thus serves as a software interface between operating system software and peripheral device hardware. The specific requirements of a particular hardware device are often handled by the device driver, making the details transparent to the operating system. A computer system typically employs many different device drivers, e.g. one for the display, one for the printer, one for the mouse, etc.
Often, a new peripheral device can be supported just by writing a new device driver tailored to exploit its hardware; no revision to the operating system is required as long as the operating system recognizes and can communicate with the device driver. Sometimes, however, significant gains in functionality and efficiency can be achieved by upgrading an operating system's facilities for interacting with device drivers (and thus with the peripheral hardware).
It is clear that for a useful and accomplished operating system, the interfaces between the operating system and the computer hardware and application software are as important as efficient internal operation of the operating system itself.
The present invention is directed to improvements in computer operating systems. In particular, the invention concerns certain Applications Program Interfaces (APIs). APIs are mechanisms by which applications software can request services from the operating system, including certain hardware operations and access to various operating system resources. APIs also serve as the means by which messages and information provided by the operating system is relayed back to the applications software for its use. (Device drivers sometimes make use of operating system APIs as well. For expository convenience, the present specification refers to software that makes use of APIs simply as “applications software”—it being understood that this usage encompasses device drivers as well.)
The evolution of APIs tracks that of computers generally. The first operating systems provided only limited collections of APIs, which were actually more in the nature of user (operator) interfaces (e.g. Print Screen) than application interfaces. As the functionality provided by computers via operating systems increased, so did the number of APIs available to access this increased functionality.
Generally, operating systems are developed for use with a specific (CPU). Thereafter, the operating system can be used on any computer that uses that or a compatible CPU, regardless of which manufacturer produced the computer, or minor idiosyncrasies in its design.
Likewise, application programs are generally developed for use with a specific operating system. To the extent that two operating systems support the same API sets, an application program is “portable” and can be executed on either system.
Contemporary operating systems are provided with rich sets of APIs—sometimes numbering in the hundreds of operating system calls and responsive messages—greatly facilitating the task of the application software development.
When implementing an API set for a new operating system or function, the straightforward approach is to write an API for each operating system function or resource that may be required by an application program or hardware device. More commonly, however, operating system APIs are developed in the process of enhancing an existing operating system. In this context, the straightforward approach is to take the predecessor operating system's API set and make use of those APIs whenever possible in the new operating system. The prior APIs can be patched or extended, where necessary, to take advantage of—for example—new hardware capabilities.
The foregoing design philosophies may be characterized largely as rote: i.e. following old ways, with old calls, old formats, and old parameters. Technically superior operating systems distinguish themselves by inventiveness beyond the rote. Invention in the interface can manifest itself in many ways: breaking out of the comfort of the old in favor of a new or unfamiliar approach; devising new operating system functions from the feature set of old CPU hardware; making existing operating system functions available in a more meaningful or efficient manner (with the same hardware); anticipating application program and hardware component needs not yet felt and laying groundwork to facilitate their eventual support, etc.
The APIs detailed in the present application are those for the Microsoft® Windows 95™ (earlier known as Chicago) operating system. These APIs were developed in part to support recent innovations in computer hardware, and in part to provide enhanced services to application programs.
As those skilled in the art will recognize, the Windows 95 APIs reflect many inventive improvements over those of its predecessor operating systems—not just in terms of raw functionality provided by the improved operating system, but also in the manner the enhanced functionality of the Windows 95 operating system is made available for use by application programs and hardware components. Among their other features, these APIs provide access to the Windows 95 operating system functionality in a manner that is comprehensive, efficient, usable, extendible and, in some cases, reusable.
The foregoing and additional features of the present invention will be more readily apparent from the following detailed description, which proceeds with reference to the accompanying drawings.